/**
 * @file 日志服务
 * @description 统一的日志处理服务
 * @author Assistant
 * @date 2024-02-05
 */

import { Injectable } from '@nestjs/common';
import { createLogger, format, transports } from 'winston';
import DailyRotateFile = require("winston-daily-rotate-file");
import { envConfig } from '../../config/env.config';
import * as path from 'path';

@Injectable()
export class LoggerService {
  private logger;

  /**
   * 构造函数
   * @description 初始化日志系统，配置日志格式和输出方式
   */
  constructor() {
    const logDir = path.resolve(process.cwd(), envConfig.logger.dir);

    // 自定义日志格式
    const customFormat = format.combine(
      format.timestamp(),
      format.printf(({ level, message, timestamp, context, ...meta }) => {
        return JSON.stringify({
          timestamp,
          level,
          context,
          message,
          ...meta
        });
      })
    );

    this.logger = createLogger({
      level: envConfig.logger.level || 'debug', // 默认使用debug级别
      format: customFormat,
      transports: [
        // 控制台输出
        new transports.Console({
          format: format.combine(
            format.colorize(),
            format.simple()
          ),
        }),
        // 按日期切割的文件日志，记录所有级别
        new DailyRotateFile({
          dirname: logDir,
          filename: 'gps-server-%DATE%.log',
          datePattern: 'YYYY-MM-DD',
          maxFiles: envConfig.logger.maxFiles,
          format: customFormat,
          level: 'debug', // 确保记录debug级别的日志
        }),
        // 错误日志单独记录
        new DailyRotateFile({
          dirname: logDir,
          filename: 'gps-server-error-%DATE%.log',
          datePattern: 'YYYY-MM-DD',
          maxFiles: envConfig.logger.maxFiles,
          format: customFormat,
          level: 'error',
        })
      ],
    });
  }

  /**
   * 记录普通信息日志
   * @param message 日志消息
   * @param context 日志上下文
   * @param meta 额外的元数据
   * @returns void
   */
  log(message: string, context?: string, meta?: Record<string, any>) {
    this.logger.info({ message, context, ...meta });
  }

  /**
   * 记录错误日志
   * @param message 错误消息
   * @param trace 错误堆栈
   * @param context 日志上下文
   * @param meta 额外的元数据
   * @returns void
   */
  error(message: string, trace?: string, context?: string, meta?: Record<string, any>) {
    this.logger.error({ message, trace, context, ...meta });
  }

  /**
   * 记录警告日志
   * @param message 警告消息
   * @param context 日志上下文
   * @param meta 额外的元数据
   * @returns void
   */
  warn(message: string, context?: string, meta?: Record<string, any>) {
    this.logger.warn({ message, context, ...meta });
  }

  /**
   * 记录调试日志
   * @param message 调试消息
   * @param context 日志上下文
   * @param meta 额外的元数据
   * @returns void
   */
  debug(message: string, context?: string, meta?: Record<string, any>) {
    this.logger.debug({ message, context, ...meta });
  }
} 